# マン・ホイットニーの U 検定
U.test <- function(	x,				# 第一群の観測値ベクトルまたは，分割表データ（y=NULL)
			y = NULL,			# 第二群の観測値ベクトル
			correct = TRUE)			# 連続性の補正を行うかどうか
{
	method <- "マン・ホイットニーの U 検定"
	if (is.null(y)) {				# 2 × C 行列の分割表として与えられたとき
		if (nrow(x) != 2) stop("2 x C matrix is expected.")
		data.name <- paste(deparse(substitute(x)), "as 2 by C matrix")
		nc <- ncol(x)				# カテゴリー数
		y <- x[2,]				# 第二群の度数分布
		x <- x[1,]				# 第一群の度数分布
		tie <- x+y				# 合計した度数分布（同順位）
		n1 <- sum(x)				# 第一群のサンプルサイズ
		n2 <- sum(y)				# 第二群のサンプルサイズ
		n <- n1+n2				# 合計したサンプルサイズ
		rj <- c(0, cumsum(tie)[-nc])+(tie+1)/2	# カテゴリーに属するものの順位
		U1 <- n1*n2+n1*(n1+1)/2-sum(x*rj)	# 検定統計量
	}
	else {						# 2 つのデータベクトルとして与えられたとき
		data.name <- paste(deparse(substitute(x)), "and", deparse(substitute(y)))
		x <- x[!is.na(x)]			# 欠損値を持つケースを除く
		y <- y[!is.na(y)]			# 欠損値を持つケースを除く
		n1 <- length(x)				# 第一群のサンプルサイズ
		n2 <- length(y)				# 第二群のサンプルサイズ
		n <- n1+n2				# 合計したサンプルサイズ
		xy <- c(x, y)				# 両群のデータを結合したもの
		r <- rank(xy)				# 順位のベクトル
		U1 <- n1*n2+n1*(n1+1)/2-sum(r[1:n1])	# 検定統計量
		tie <- table(r)				# 同順位の集計
	}
	U <- min(U1, n1*n2-U1)				# U 統計量
	V <- n1*n2*(n^3-n-sum(tie^3-tie))/12/(n^2-n)	# 同順位を考慮した分散
	E <- n1*n2/2					# 期待値
	Z <- (abs(U-E)-ifelse(correct, 0.5, 0))/sqrt(V)	# Z 値
	P <- pnorm(Z, lower.tail=FALSE)*2		# 両側 P 値
	return(structure(list(statistic=c(U=U, "E(U)"=E, "V(U)"=V, "Z-value"=Z), p.value=P,
		method=method, data.name=data.name), class="htest"))
}